package com.mdl.springmvc.ioStream.file;

import java.io.File;
import java.util.Date;

/**
 * @Desc File类的构造方法
 *     File(String pathname)：根据一个路径得到一个File对象
 *     File(String parent, String child)：根据一个目录和一个子文件夹/目录得到File对象
 *     FIle(File parent, String child)：根据一个父File对象和一个子文件/目录得到File对象
 *
 *     创建功能
 *     public boolean createNewFile():创建文件 如果存在这样的文件，就不创建了
 *     public boolean mkdir():创建文件夹 如果存在这样的文件夹，就不创建了
 *     public boolean mkdirs():创建文件夹，如果父文件夹不存在，会帮你创建出来
 *
 *     删除功能 public boolean delete():可以用来删除文件和文件夹
 *
 *     重命名功能 public boolean renameTo(File dest):可以给文件或者文件夹改名字
 *
 *     判断功能
 *     public boolean isDirectory():判断是否是目录
 *     public boolean isFile():判断是否是文件
 *     public boolean exists():判断是否存在
 *     public boolean canRead():判断是否可读
 *     public boolean cnaWrite():判断是否可写
 *     public boolean isHidden():判断是否隐藏
 *
 *     获取功能
 *     public String getAbsolutePath():获取绝对路径
 *     public String getPath():获取相对路径
 *     public String getName():获取名称
 *     public long length():获取长度。字节数
 *     public long lastModified():获取最后一次的修改时间，毫秒值
 *
 *     public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
 *     public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
 * @Author madengling
 * @Time 2020/12/24 17:35
 */
public class FileTest01 {
    public static void main(String[] args) throws Exception {
        String path = "G:\\dhcc\\idea\\MavenProject\\src\\main\\webapp\\files\\";
        //Java中一个"\"代表的是转义字符开始标志，你要是想用"\"，必须用两个"\"来表示
        File file1 = new File(path+"a\\b.txt");
        //Java中认为文件夹是一种特殊的文件，只不过文件夹中的内容是其他的文件或文件夹，而文件中是数据
        File file2 = new File(path+"a","b.txt");
        File file = new File(path+"a");
        File file3 = new File(file,"b.txt");

        File file4 = new File(path+"a\\cc.txt");
        boolean rst = file4.createNewFile();
        System.out.println("rst:"+rst);
        //如果没有指明创建文件的路径 那么改文件是在项目路径下创建
//        File file5 = new File("dd.txt");
//        boolean rst2 = file5.createNewFile();
//        System.out.println("rst:"+rst2);
        //如果路径不存在能不能创建？不能 java.io.IOException：系统找不到指定的路径
        //如果调用该createNewFile方法的时候 路径必须存在
//        File file6 = new File(path+"b\\c.txt");
//        boolean rst3 = file6.createNewFile();
//        System.out.println("rst3:"+rst3);
        File file7 = new File(path+"b");
        boolean rst4 = file7.mkdir();
        System.out.println("rst4:"+rst4);
        //mkdir方法不能创建多层文件夹
        File file8 = new File(path+"c\\a");
        boolean rst5 = file8.mkdir();
        System.out.println("rst5:"+rst5);
        //mkdirs是用来创建多层文件夹的
        boolean rst6 = file8.mkdirs();
        System.out.println("rst6:"+rst6);
        //注意：同一个项目下，文件和文件夹不能同名
//        File file9 = new File("bbbbb");
//        file9.mkdir();//创建的是文件夹
//        file9.createNewFile();//创建的是文件 只不过这个文件没有后缀名

        boolean delete = file4.delete();
        System.out.println("delete:"+delete);
        boolean delete2 = file8.delete();
        System.out.println("delete2:"+delete2);
        //b下边还有文件夹，没有删除成功
        //注意：delete删除的文件夹下不能有文件或文件夹
        File file10 = new File(path+"b");
        boolean delete3 = file10.delete();
        System.out.println("delete3:"+delete3);

        //如果File改名的路径是在同一个文件夹下，如果File改名的路径不在同一个文件夹下是剪贴
        boolean rename1 = file1.renameTo(new File(path+"a\\bb.txt"));
        System.out.println("rename1:"+rename1);
        boolean rename2 = file10.renameTo(new File(path+"bb"));
        System.out.println("rename2:"+rename2);
        //移动
        File file11 = new File(path+"bb\\b\\b.txt");
        boolean rename3 = file11.renameTo(new File(path+"c\\bbbb.txt"));
        System.out.println("rename3:"+rename3);

        File file12 = new File(path+"bb\\b");
        boolean rst7 = file12.isDirectory();
        System.out.println("rst7:"+rst7);
        File file13 = new File(path+"a\\bb.txt");
        boolean rst8 = file13.isFile();
        System.out.println("rst8:"+rst8);
        boolean rst9 = file13.exists();
        System.out.println("rst9:"+rst9);
        boolean rst10 = file13.canRead();
        System.out.println("rst10:"+rst10);
        boolean rst11 = file13.canWrite();
        System.out.println("rst11:"+rst11);
        boolean rst12 = file13.isHidden();
        System.out.println("rst12:"+rst12);

        String absolutePath = file12.getAbsolutePath();
        System.out.println("absolutePath:"+absolutePath);
        System.out.println("absolutePath:"+file13.getAbsolutePath());
        //获取相对路径
        String path1 = file12.getPath();
        System.out.println("path1:"+path1);
        //不带路径，只有文件或文件夹名称
        System.out.println(file13.getName());
        //文件的长度
        System.out.println(file13.length());
        //文件夹的长度总是0  ？？
        System.out.println(file.length());
        long time = file13.lastModified();
        Date d = new Date(time);
        System.out.println(d.toLocaleString());

        File file14 = new File(path);
        String[] names = file14.list();
        for(String name : names){
            System.out.print(name+" ");
        }
        System.out.println();
        System.out.println("====================");
        File[] listFiles = file14.listFiles();
        for(File files : listFiles){
            System.out.println(files.getAbsolutePath());
        }
        System.out.println("====================");

        //判断路径下是否有后缀名为.png的文件，如果有，就输出此文件的绝对路径！
        /*
        把要搜索的目录包装成File对象
        得到该路径下的所有文件名称
        判断每个文件名是否以png结尾，如果是就打印出来
         */
        for(File files : listFiles){
            if(files.getName().endsWith(".png")){
                System.out.println(files.getAbsolutePath());
            }
        }

        //批量改文件的名字，把文件夹中类似于文件码，“零基础学Java_001_IO流_IO流概述”改成“001_IO流概述”
        /*
        得到所有的文件对象（把所有的要改名字的文件变成File对象）
            得到所在文件的木
            通过对这个目录进行file对象的包装，得到它下面所有File对象（listFiles）
        遍历所有的文件对象，在遍历的过程中对文件进行改名（renameTo）
            得到原来文件的名称（getName）
            对原来的文件的名字进行提取（字符串内容截取，substring）
            截取之后拼接成一个新的名字
            利用原来该文件所在的文件路径+新名字，构建一个新的File对象
            原来的文件对象.renameTo(构造的新的File对象)
         */
        File file15 = new File(path+"bb\\b");
        File[] listFiles2 = file15.listFiles();
        for(File files : listFiles2){
            String name = files.getName().substring(files.getName().indexOf("00"),files.getName().indexOf("00")+3)
                    + files.getName().substring(files.getName().lastIndexOf("_"));
            File file0 = new File(file15, name);
            files.renameTo(file0);
        }
    }
}
